import {
  Injectable,
  Logger,
  OnModuleInit,
  OnModuleDestroy,
} from '@nestjs/common';

import { NacosConfigClient } from 'nacos';
import * as fs from 'fs';
import * as path from 'path';

@Injectable()
export class NacosConfigService implements OnModuleInit, OnModuleDestroy {
  private client: NacosConfigClient;
  private readonly logger = new Logger(NacosConfigService.name);
  private watcher: fs.FSWatcher;
  constructor() {
    this.client = new NacosConfigClient({
      serverAddr: '127.0.0.1:8848',
    });
  }
  async onModuleInit() {
    await this.client.ready();
    // 自动获取配置文件
    await this.updateNacosConfig();
    // 监听配置变动
    this.watchEnvFiles();
  }

  onModuleDestroy() {
    // 清理文件监视器
    if (this.watcher) {
      this.watcher.close();
    }
  }
  /**
   * 获取.env 文件
   */
  getEnvFilePath() {
    const env = process.env.NODE_ENV || 'development';
    const filePath = path.resolve(__dirname, `../../../.env.${env}`);
    return filePath;
  }
  parseEnvConfig(content: string) {
    const lines = content.split('\n');
    const config: Record<string, string> = {};

    lines.forEach((line) => {
      line = line.trim();
      if (line === '' || line.startsWith('#')) {
        return; // 忽略空行和注释
      }
      const [key, ...valueParts] = line.split('=');
      const value = valueParts.join('=').trim(); // 支持值中包含 "=" 的情况
      if (key && value) {
        if (key.trim() === 'SERVICE_LIST') {
          (config as any)[key.trim()] = value.split(' ').filter(Boolean); // 根据空格拆分，并过滤空字符串
        } else {
          config[key.trim()] = value;
        }
      }
    });
    const res = JSON.stringify(config);
    return res;
  }

  /**
   * 监控.env 文件
   */
  watchEnvFiles() {
    const envFile = this.getEnvFilePath();
    // 使用 fs.watch 监听 .env 文件
    this.watcher = fs.watch(envFile, async (eventType, filename) => {
      if (eventType === 'change') {
        this.logger.log(`${filename}文件改变. Nacos更新配置信息...`);
        await this.updateNacosConfig();
      }
    });
  }
  /**
   * 更新配置
   */
  async updateNacosConfig() {
    try {
      // 读文件地址
      const envFile = this.getEnvFilePath();
      // 读取内容
      const content = fs.readFileSync(envFile, 'utf8');
      // 处理内容
      const parsedConfig = this.parseEnvConfig(content);
      // 保存内容
      await this.saveConfigToNacos(parsedConfig);
    } catch (error) {
      this.logger.error('更新Nacos配置失败：', error);
    }
  }
  /**
   * 保存配置
   * @param config 配置信息
   */
  async saveConfigToNacos(configString: string) {
    try {
      const dataId: string = 'dev-config'; // 根据实际情况修改
      const group: string = 'DEFAULT_GROUP'; // 根据实际情况修改
      await this.client.publishSingle(dataId, group, configString); // 将配置保存到 Nacos
    } catch (error) {
      this.logger.error('保存Nacos配置失败：', error);
    }
  }

  /**
   * 查看 配置
   * @param dataId id
   * @param group 分组
   * @returns 内容
   */
  async getConfig(dataId: string, group: string) {
    const result = await this.client.getConfig(dataId, group);
    // console.log('查看', content);
    return result;
  }

  /**
   * 新增/编辑 配置
   * @param dataId id
   * @param group 分组
   * @param content 内容
   * @returns 返回成功内容
   */
  async createConfig(dataId: string, group: string, content: string) {
    const result = await this.client.publishSingle(dataId, group, content);
    // console.log('新增/编辑', result);
    return result;
  }

  /**
   * 删除 配置
   * @param dataId id
   * @param group 分组
   * @returns true 成功 false 失败
   */
  async removeConfig(dataId: string, group: string) {
    const result = await this.client.remove(dataId, group);
    // console.log('删除', result);
    return result;
  }
}
